/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package PanelesDeMenu;

import PanelDeProductos.Producto;
import PanelesDePlatos.Plato;
import PanelesDeTrabajo.PanelPrincipalMenu;
import com.google.gson.Gson;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.table.DefaultTableModel;
import net.miginfocom.swing.MigLayout;

/**
 *
 * @author Anonymus
 */
public class PanelCrearMenu extends JPanel implements ActionListener, KeyListener, MouseListener
{
    JPanel panel1;
    JPanel panel2;
    JPanel panel3;
    JPanel panel4;
    JPanel panelAux1;
    JPanel panelAux2;
    JPanel panelAux3;
    JPanel panelAux4;
    
    
    //COMPONENTES
    //Labels
    JLabel LNombre;
    JLabel LPrecio;
    JLabel LFoto;
    JLabel LCalorias;
    JLabel LDescripcion;
    JLabel LRecomendacion;
    JLabel LPlato;
    JLabel LProducto;
    //TextFields
    JTextField TNombre;
    JTextField TPrecio;
    JTextField TCalorias;
    //TextAreas
    JTextArea TDescripcion;
    JTextArea TRecomendacion;
    JScrollPane scrollDescripcion;
    JScrollPane scrollRecomendacion;
    //Table
    JTable tablaComponentes;
    DefaultTableModel modelo;
    JScrollPane scrollTabla;
    //ComboBox
    JComboBox comboBoxPlatos;
    JComboBox comboBoxProductos;
    //Buttons
    JButton buscar;
    JButton añadirPlatos;
    JButton añadirProductos;
    JButton eliminar;
    JButton crearMenu;
    JButton flechaIzquierda, flechaDerecha;
    
    private JPanel panelFoto;
    private ImageIcon icon;
    private JLabel labelFotoVisible;
    private ArrayList<Plato> platosBox = new ArrayList<Plato>();
    private ArrayList<Producto> productosBox = new ArrayList<Producto>();
    private ArrayList<String> imagenes = new ArrayList<String>();
    private Gson gson = new Gson();
    
    private ArrayList<Plato> platosMenu = new ArrayList<Plato>();
    private ArrayList<Producto> productosMenu = new ArrayList<Producto>();
    
    private int totalCalorias = 0;
    private int filaTabla;
    private int indiceImagen;
    private String rutaAbsolutaImg;
    public boolean menuAgregado = false;
    

    public PanelCrearMenu() 
    {
        icon = new ImageIcon("src/Resource/sin_foto.PNG");
        ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(150, 100, Image.SCALE_DEFAULT));
        
        this.setLayout(new BorderLayout());
        panel1 = new JPanel(new BorderLayout());
        panelAux1 = new JPanel(new MigLayout());
        panelAux2 = new JPanel(new MigLayout());
        panel2 = new JPanel(new MigLayout());
        panelAux3 = new JPanel(new BorderLayout());
        panelAux4 = new JPanel(new BorderLayout());
        panel3 = new JPanel(new MigLayout());
        panel4 = new JPanel(new BorderLayout());
        this.panelFoto = new JPanel();
        this.panelFoto.setSize(new Dimension(10,10));
        this.panelFoto.setLayout(new MigLayout());  
        
        ////////LABELS//////////////////////////////////////////////////////////
    /**/LNombre = new JLabel("Nombre: ");
        LPrecio = new JLabel("Precio: $");
        LFoto = new JLabel("Foto: ");
        LCalorias = new JLabel("Aporte Calórico: (Kcal)");
        LDescripcion = new JLabel("Descripción ");
        LRecomendacion = new JLabel("Recomendación ");
        LPlato = new JLabel("Plato");
        LProducto = new JLabel("Producto");
        labelFotoVisible = new JLabel(icon2);
        
        ////////////////////////////////////////////////////////////////////////
        ////////TEXTFIELDS//////////////////////////////////////////////////////
    /**/TNombre = new JTextField(80);
        TPrecio = new JTextField(10);
        TPrecio.setText("0");
        TCalorias = new JTextField(10);
        TCalorias.setText("0"); ;
        TCalorias.setEditable(false);/**/
        ////////////////////////////////////////////////////////////////////////
        TDescripcion = new JTextArea(10, 28);
        TRecomendacion = new JTextArea(10, 28);
        
        scrollDescripcion = new JScrollPane(this.TDescripcion);
        scrollRecomendacion = new JScrollPane(this.TRecomendacion);
        
        modelo = new DefaultTableModel();
        tablaComponentes = new JTable(modelo);
        modelo.addColumn("Nombre");
        modelo.addColumn("Aporte Calórico");
        tablaComponentes.getTableHeader().setReorderingAllowed(false);
        scrollTabla = new JScrollPane(this.tablaComponentes);
        scrollTabla.setViewportView(this.tablaComponentes);
        
        ///////COMBOBOXS////////////////////////////////////////////////////////
    /**/comboBoxPlatos = new JComboBox();
        comboBoxProductos = new JComboBox();
        ////////////////////////////////////////////////////////////////////////
        ///////////BOTONES//////////////////////////////////////////////////////
    /**/ImageIcon iconBoton1 = new ImageIcon("src/Resource/plus.JPG");
        ImageIcon iconBoton2 = new ImageIcon("src/Resource/plus.JPG");
        ImageIcon iconBoton3 = new ImageIcon("src/Resource/crearMenu.PNG");
        ImageIcon iconBoton4 = new ImageIcon("src/Resource/eliminar.PNG");
//        ImageIcon iconBoton5 = new ImageIcon("src/Resource/cargarFoto.JPG");
        añadirPlatos = new JButton(iconBoton1);
        añadirProductos = new JButton(iconBoton2);
        crearMenu = new JButton(iconBoton3);
        eliminar = new JButton(iconBoton4);
        buscar  = new JButton("Examinar");
        flechaDerecha = new JButton();
        this.flechaIzquierda = new JButton();
        this.flechaDerecha.setIcon(new ImageIcon("src/Resource/flecha_derecha.PNG"));
        this.flechaIzquierda.setIcon(new ImageIcon("src/Resource/flecha_izquierda.PNG"));
        
        añadirPlatos.setBorder(null);
        añadirProductos.setBorder(null);
        crearMenu.setBorder(null);
        eliminar.setBorder(null);
        
        añadirPlatos.addActionListener(this);
        añadirProductos.addActionListener(this);
        buscar.addActionListener(this);
        crearMenu.addActionListener(this);
        eliminar.addActionListener(this);
        this.flechaDerecha.addActionListener(this);
        this.flechaIzquierda.addActionListener(this);
        this.comboBoxPlatos.addActionListener(this);
        this.comboBoxProductos.addActionListener(this);
        TPrecio.addKeyListener(this);/**/
        ////////////////////////////////////////////////////////////////////////
        ////Se agregan todos los componentes del panel crear menu
        this.panelAux1.add(this.LNombre);
        this.panelAux1.add(this.TNombre);
        this.panelAux2.add(this.LPrecio);
        this.panelAux2.add(this.TPrecio);
        this.panelAux2.add(this.LCalorias);
        this.panelAux2.add(this.TCalorias);
        this.panelAux2.add(this.LFoto);
        this.panelAux2.add(this.buscar);
        
        this.panel1.add(this.panelAux1, BorderLayout.NORTH);
        this.panel1.add(this.panelAux2, BorderLayout.CENTER);
        
        this.panel2.add(this.LPlato);
        this.panel2.add(this.comboBoxPlatos);
        this.panel2.add(this.añadirPlatos, "wrap");
        this.panel2.add(this.LProducto);
        this.panel2.add(this.comboBoxProductos);
        this.panel2.add(this.añadirProductos);
        
        this.panelAux4.add(this.eliminar, BorderLayout.WEST);
        
        this.panelFoto.add(labelFotoVisible);
        this.panelFoto.add(flechaIzquierda);
        this.panelFoto.add(flechaDerecha);
        
        
        this.panel3.add(this.panelFoto, "wrap");
        this.panel3.add(this.LDescripcion,"wrap");
        this.panel3.add(this.scrollDescripcion,"wrap");
        this.panel3.add(this.LRecomendacion,"wrap");
        this.panel3.add(this.scrollRecomendacion,"wrap");
       
        this.panelAux3.add(this.panel2, BorderLayout.NORTH);
        this.panelAux3.add(this.scrollTabla, BorderLayout.CENTER);
        this.panelAux3.add(this.panel3, BorderLayout.EAST);
        this.panelAux3.add(this.panelAux4, BorderLayout.SOUTH);
        
        this.panel4.add(this.crearMenu, BorderLayout.EAST);
        
        /**/
        
        this.add(this.panel1, BorderLayout.NORTH);
        this.add(this.panelAux3, BorderLayout.WEST);
        this.add(this.panel4, BorderLayout.SOUTH);
        
        leerTxtPlatos();
        leerTextProductos();
        llenarComboBoxPlatos();
        llenarComboBoxProductos();
        desabilitarEliminacion();
    }
    

    @Override
    public void actionPerformed(ActionEvent e)
    {
        
        if(e.getSource()==this.buscar)
        {
            JFileChooser chooser = new JFileChooser();
            FileNameExtensionFilter filtroImagen = new FileNameExtensionFilter("JPG & PNG", "jpg","png");
            chooser.setFileFilter(filtroImagen);
            chooser.setAcceptAllFileFilterUsed(false);
            chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int estado = chooser.showOpenDialog(null);
            
            if (estado == JFileChooser.APPROVE_OPTION)
            {
                File archivo = chooser.getSelectedFile();
                rutaAbsolutaImg = archivo.getAbsolutePath();
                ImageIcon imagen = new ImageIcon(archivo.getAbsolutePath());
                ImageIcon imagen2 = imagenRedimensionada(imagen);
                JOptionPane.showMessageDialog(this, "Su imagen fue agregada con éxito");
                imagenes.add(rutaAbsolutaImg);
                indiceImagen++;
                this.labelFotoVisible.setIcon(imagen2);
            }
        }
        
        if(e.getSource() == añadirPlatos)
        { 
            
            if (comboBoxPlatos.getItemCount() > 0)
            {
                int indice = comboBoxPlatos.getSelectedIndex();
                String nombre = comboBoxPlatos.getItemAt(indice).toString();
                System.out.println("nombre plato box: "+nombre);
                agregarPlatoTabla(nombre);
                TCalorias.setText(totalCalorias+"");
                desabilitarEliminacion();
            }
        }
        
        if(e.getSource() == añadirProductos)
        {
            if (comboBoxProductos.getItemCount() > 0)
            {
                String nombre = comboBoxProductos.getSelectedItem().toString();
                System.out.println("nombre producto box: "+nombre);
                agregarProductosTabla(nombre);
                TCalorias.setText(totalCalorias+"");
                desabilitarEliminacion();
            }
        }
        
        if(e.getSource()==this.crearMenu)
        {
            int num = Integer.parseInt(TPrecio.getText());
            
            if (TPrecio.getText().isEmpty() || TNombre.getText().isEmpty() ||
                TDescripcion.getText().isEmpty() || TRecomendacion.getText().isEmpty()) //si alguno está vacío
            {
                JOptionPane.showMessageDialog(null, "Falta uno o más campos que rellenar, por favor rellénelos!", "Falta de información",JOptionPane.ERROR_MESSAGE);
            }
            if (num <= 0)
            {
                JOptionPane.showMessageDialog(null, "Precio solo permite valores mayores que cero", "Error de datos",JOptionPane.ERROR_MESSAGE);
            }
            else
            {
                String nombre = TNombre.getText();
                String recomendacion =  TRecomendacion.getText();
                String descripcion =  TDescripcion.getText();
                int precio = Integer.parseInt(TPrecio.getText());
                menuAgregado = true;
            
//                cargarArrayPlatos();
//                cargarArrayProductos();
                cargarComponentesMenu();
                Menus menus = new Menus(nombre,descripcion,recomendacion, imagenes, 0, precio, totalCalorias, platosMenu,productosMenu);
            
                JOptionPane.showMessageDialog(this, "Su plato fue agregado con éxito");
                guardarMenuTxt(menus);
                camposEnBlanco();
                
            }
        }
        
        if(e.getSource()==this.eliminar)
        {
            Object info = modelo.getValueAt(filaTabla, 1);
            int resta = Integer.parseInt(info.toString());
            totalCalorias = totalCalorias - resta;
            TCalorias.setText(totalCalorias+"");
            this.modelo.removeRow(filaTabla);
            desabilitarEliminacion();
        }
        if (e.getSource() == flechaDerecha)
        {
            cambiarImagen("derecha");
        }
        if (e.getSource() == flechaIzquierda)
        {
            cambiarImagen("izquierda");
        }
    }
    
    @Override
    public void keyTyped(KeyEvent e) 
    {
        Object componente = e.getComponent();
        int key = (int)e.getKeyChar();
        
        if (componente == TPrecio)
        {
            if ((key >= 97 && key <= 122) || (key >= 65 && key <= 90))
            {
                e.consume();
                JOptionPane.showMessageDialog(null, "No puede ingresar letras, sólo valores numéricos!", "Error de entrada",JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    @Override
    public void keyPressed(KeyEvent e) 
    {
        
    }

    @Override
    public void keyReleased(KeyEvent e) 
    {
        
    }
    
    public ImageIcon imagenRedimensionada(ImageIcon icon)
    {
        if (icon.getIconHeight() > 150 && icon.getIconHeight() > 100)
        {
            ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(150, 100, Image.SCALE_DEFAULT));
            return icon2;
        }
        else
        {
            return icon;
        }
    }
    
    public void llenarComboBoxPlatos()
    {
        comboBoxPlatos.removeAllItems();
        
        for (int i=0; i<platosBox.size(); i++)
        {
            comboBoxPlatos.addItem(platosBox.get(i).getNombre());
        }
    }
    
    public void llenarComboBoxProductos()
    {
        comboBoxProductos.removeAllItems();
        
        for (int i=0; i<productosBox.size(); i++)
        {
            comboBoxProductos.addItem(productosBox.get(i).getNombre());
        }
    }
    
    public void leerTxtPlatos()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        platosBox.clear();
        
        try
        {
            archivo = new File ("C:\\BaseDeDatos\\platos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Plato plato = (Plato)gson.fromJson(linea, Plato.class);
                
                if (!existePlato(plato))
                {
                    platosBox.add(plato);
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }
    
    public void leerTextProductos()
    {
        File archivo = null;
        FileReader fr = null;
        BufferedReader br = null;
        productosBox.clear();
        
        try
        {
            archivo = new File ("C:\\BaseDeDatos\\productos.txt");
            fr = new FileReader (archivo);
            br = new BufferedReader(fr);
            
            String linea;
            
            while((linea=br.readLine())!=null)
            {
                Producto producto = (Producto)gson.fromJson(linea, Producto.class);
                
                if (!existeProducto(producto))
                {
                    productosBox.add(producto);
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                if( null != fr )
                {   
                    fr.close();     
                }                  
            }
            catch (Exception e2)
            {
                e2.printStackTrace();
            }
        }
    }

    private void agregarPlatoTabla(String nombre)
    {
        for (int i = 0; i < platosBox.size(); i++) 
        {
            if(nombre.equals(platosBox.get(i).getNombre()))
            {
                Object[] array = new Object[2];
                array[0] = nombre;
                array[1] = platosBox.get(i).getAporteCalorico();
                totalCalorias = totalCalorias + platosBox.get(i).getAporteCalorico();
                modelo.addRow(array);
                
            }
            
        }
    }

    private void agregarProductosTabla(String nombre) 
    {
        for (int i = 0; i < productosBox.size(); i++) 
        {
            if(nombre.equals(productosBox.get(i).getNombre()))
            {
                Object[] array = new Object[2];
                array[0] = nombre;
                array[1] = productosBox.get(i).getAporteCalorico();
                totalCalorias = totalCalorias + productosBox.get(i).getAporteCalorico();
                modelo.addRow(array);
                
            }
            
        }
    }
    
    public boolean existePlato(Plato plato)
    {
        for (int i=0; i<platosBox.size(); i++)
        {
            if (plato.getNombre().equals(platosBox.get(i).getNombre()))
            {
                return true; //Existe
            }
        }
        return false; //No existe
    }
    
    public boolean existeProducto(Producto producto)
    {
        for (int i=0; i<productosBox.size(); i++)
        {
            if (producto.getNombre().equals(productosBox.get(i).getNombre()))
            {
                return true;
            }
        }
        return false;
    }
    
    private void desabilitarEliminacion() 
    {
        if (modelo.getRowCount() == 0)
        {
            this.eliminar.setEnabled(false);
        }
        else
        {
            this.eliminar.setEnabled(true);
        }
    }
    
    public void cambiarImagen(String direccion)
    {
        ImageIcon icon;
        ImageIcon icon2;
        
        if (imagenes.size() > 0)
        {
            if (direccion.equals("derecha"))
            {
                if ((indiceImagen + 1) < imagenes.size()) //Preguntamos si hay una imagen siguiente
                {
                    icon = new ImageIcon(imagenes.get(indiceImagen + 1));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2); //Mostramos la imagen siguiente
                    indiceImagen++;
                }
                else
                {
                    icon = new ImageIcon(imagenes.get(0));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2);
                    indiceImagen = 0;
                }
            }
            else
            {
                if ((indiceImagen - 1) >= 0) //Si aquel indice esta dentro del rango
                {
                    icon = new ImageIcon(imagenes.get(indiceImagen - 1));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2); //Mostramos la imagen anterior
                    indiceImagen--;
                }
                else
                {
                    int indiceUltima = imagenes.size() - 1;
                    icon = new ImageIcon(imagenes.get(indiceUltima));
                    icon2 = new ImageIcon(icon.getImage().getScaledInstance(100, 130, Image.SCALE_DEFAULT));
                    labelFotoVisible.setIcon(icon2);
                    indiceImagen = indiceUltima;
                }
            }
        }
    }

    @Override
    public void mouseClicked(MouseEvent e)
    {
        this.filaTabla = tablaComponentes.rowAtPoint(e.getPoint()); //Obtenemos la fila donde se ha hecho click
    }

    @Override
    public void mousePressed(MouseEvent e)
    {
        
    }

    @Override
    public void mouseReleased(MouseEvent e) 
    {
        
    }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        
    }

    @Override
    public void mouseExited(MouseEvent e) 
    {
            
    }

    public void cargarComponentesMenu() //LLenamos los arraylist de platos y productos segun corresponda cada componente de la tabla
    {
        platosMenu.clear();
        productosMenu.clear();
        
        for (int i=0; i<modelo.getRowCount(); i++)
        {
            String componente = (String)modelo.getValueAt(i, 0);
            
            if (tipoComponente(componente)) //si es true, es plato. si es false, es producto
            {
                int indicePlato = indicePlatoCargado(componente);
                platosMenu.add(platosBox.get(indicePlato));
            }
            else
            {
                int indiceProducto = indiceProductoCargado(componente);
                productosMenu.add(productosBox.get(indiceProducto));
            }
        }
    }
    
    public boolean tipoComponente(String componente) //true es plato, false es producto
    {
        for (int i=0; i<platosBox.size(); i++)
        {
            if (componente.equals(platosBox.get(i).getNombre()))
            {
                return true;
            }
        }
        return false;
    }
    
    public int indicePlatoCargado(String nombre) //Dado un nombre de plato, lo busco y retorno su indice. Para luego cargarlo al array de platos para el menu
    {
        for (int i=0; i<platosBox.size(); i++)
        {
            if (nombre.equals(platosBox.get(i).getNombre()))
            {
                return i;
            }
        }
        return 0;
    }
    
    public int indiceProductoCargado(String nombre) //Dado un nombre de producto, lo busco y retorno su indice. Para luego cargarlo al array de productos para el menu
    {
        for (int i=0; i<productosBox.size(); i++)
        {
            if (nombre.equals(productosBox.get(i).getNombre()))
            {
                return i;
            }
        }
        return 0;
    }
    
    public void guardarMenuTxt(Menus menus)
    {
        String json = gson.toJson(menus);
        
        try
        {
            FileWriter writer = new FileWriter("C:\\BaseDeDatos\\menus.txt", true);
            writer.write(json);
            writer.write("\n");
            writer.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    private void camposEnBlanco()
    {
        TNombre.setText("");
        //textoValoracion.setText("");
        TCalorias.setText("0");
        TPrecio.setText("");
        TDescripcion.setText("");
        TRecomendacion.setText("");
        rutaAbsolutaImg = "src/Resource/sin_foto.PNG";
        ImageIcon icon2 = new ImageIcon(icon.getImage().getScaledInstance(150, 100, Image.SCALE_DEFAULT));
        labelFotoVisible.setIcon(icon2);
        imagenes.clear();
        
        while (modelo.getRowCount() > 0)
        {
            modelo.removeRow(0);
        }
        
    }

    public void setComboBoxPlatos(JComboBox comboBoxPlatos) {
        this.comboBoxPlatos = comboBoxPlatos;
    }

    public void setComboBoxProductos(JComboBox comboBoxProductos) {
        this.comboBoxProductos = comboBoxProductos;
    }
    
    public int getCantidadPlatosBox()
    {
        return comboBoxPlatos.getItemCount();
    }
    
    public int getCantidadProductosBox()
    {
        return comboBoxProductos.getItemCount();
    }
    
    public int getCantidadPlatos()
    {
        return platosBox.size();
    }
    
    public int getCantidadProductos()
    {
        return productosBox.size();
    }
    
    public void vaciarPlatosBox()
    {
        comboBoxPlatos.removeAllItems();
    }
    
    public void vaciarProductosBox()
    {
        comboBoxProductos.removeAllItems();
    }
    
    
 
}